奥泰摆焊需求和方案文档
修订日期 | 修订版本 | 修订内容 | 修订人 |
---|---|---|---|
2025.03.14 | V0.1 | 初始化文档 | 赵锦强 |
2025.04.09 | V0.2 | 完善开发内容及关键问题 | 赵锦强 |
2025.04.23 | V0.3 | 增加摆动停留时间解耦方案 | 赵锦强 |
[TOC]
1. 摆焊简介
焊接摆动是提升焊接质量、适应不同工艺需求的重要手段,在传统非摆动焊接中,熔池仅依靠材料自身流动性融合,当拼缝宽度超过0.15mm时,易因熔池冷却过快导致气孔、砂眼等缺陷。摆动焊接通过激光或焊丝的机械搅拌作用(如圆形、正弦轨迹),增强熔池内部流动,促使两种材料充分混合,减少未熔合现象。
2. 偏移叠加框架调整
摆焊运动由焊接中心线和偏移量叠加而成。以前中心线的轨迹规划和偏移量叠加计算均在plan模块进行,偏移叠加和plan算法逻辑耦合,对plan的算法开发以及摆焊类型和参数的新增都带来负担,不利于长远开发。
因此,将偏移叠加计算放在interface层或者软件层,plan只进行焊接中心线的轨迹规划,将两者解耦开。
方案:先实现正弦摆动
轨迹点新增属性
- 相对于路径起始点的弧长;
- 摆动平面X(路径切线方向)和Y方向(只由路径切线方向和起点工具z轴确定)
Interface层需对不同ID的路径长度进行累加,以计算摆动幅值
3. 摆焊需求和方案
3.1 摆焊方位角、中心上升设置
方位角:相对于摆焊坐标系,使得摆焊平面绕着参考坐标系Z轴旋转(只旋转Y轴,X轴保 持不变)。
- 前后摆动:方位角为0deg
- 左右摆动:方位角为90deg
- 斜向摆动:方位角为0 ~90deg
中心上升:指在摆焊的中心处焊炬的隆起量。通常在执行多层多道焊接时,为了避开中 心处的焊道高度,设置的中心隆起量
计算:每四分之一步长在摆动坐标系z轴线性上升或者下降高度h(本质是z轴方向的叠加)
在一个周期中:下降—>上升-->下降-->上升 (过程中高度需大于等于0),起点不上升,位于中心线上
3.2 L型摆动
L型主要在角焊接和 V 坡口的焊接中使用, 可有效提升角焊和V坡口焊接的熔合质量。
- 角焊:如箱体、框架结构的直角焊缝
- V坡口焊接:适用于需要填充较大坡口的厚板焊接。
3.3 焊接参数实时调整
aral_export增加接口:
struct SuperimposedParameters
{
bool enable{false}; // 使能路径叠加功能(在运动路径的法平面内进行叠加)
WeaveType type; // 摆动类型(针对焊接应用, 支持正弦,摆线)
double frequency{0}; // 摆动频率,范围[0.1, 5], 单位: Hz
Array2d amplitude{ {0, 0} }; // 一个周期内在运动叠加方向的最大幅值(不一定对称),当复用为摆线的幅值时,只用第一个元素
Array2d hold_distance{ {0, 0} }; // 运动到最大幅值处保持的距离(不一定对称),当复用为摆线的宽度时,只用第一个元素
Array2d hold_time{ {0, 0} }; // 运动到最大幅值处停留的时间(不一定对称),暂只支持正弦
double angle{0}; // 运动叠加方向与法平面的夹角,单位rad
int direction{0}; // 摆线起始摆动方向, 0表示在路径方向上方, 1表示在路径方向下方
double ori_weave_range{0}; // 姿态摆动范围(0~ori_weave_range),主要和阿基米德螺旋线配合使用,实现力控搜孔应用
double ori_weave_frequency{0}; // 姿态摆动频率(单位弧长对应的摆动次数) 范围: [0, 1]
}; // 叠加路径属性
/**
* @brief 设置摆动参数,位置摆主要用于焊接,姿态摆主要用于力控寻孔
* @param sp: 摆动参数,具体参考SuperimposedParameters结构体
* @return: 返回值 < 0, 表示设置失败
*/
ARAL_API_COMMON(1.0) int tpSetWeaveParameters(const SuperimposedParameters& sp) = 0;
/**
* @brief 支持在摆动过程中调整频率和振幅,暂只支持正弦摆
* @param frequency: 摆动参数频率, 范围[0.1, 5], 单位: Hz
* @param amplitude: 两侧摆动幅值, 单位: m
* @return: 返回值 < 0, 表示调整失败
*/
ARAL_API_COMMON(1.0) int tpUpdateWeaveParameters(const double& frequency, const Array2d& amplitude) = 0;
摆动周期:将一个完整的正弦摆或者L型摆定义为一个摆动周期
动态调整基本思想:当前周期不调整,总是从下一周期开始调整。摆动频率和振幅给定1~2个摆动周期的调整时间,焊接速度和幅值处停留时间/距离从下一摆动周期生效。
频率渐变:蓝色(当前周期)、红色(调整周期)、绿色(生效周期)
振幅渐变:蓝色(当前周期)、红色(调整周期)、绿色(生效周期)
频率振幅渐变:蓝色(当前周期)、红色(调整周期)、绿色(生效周期)
摆动停留时间:摆动停留处焊接速度为0,当频率发生改变,即步长改变,速度为0点改变,就需要plan模块重新规划。plan模块需考虑对组合路径进行规划,支持指定中间点速度,且无需路径分割。
摆动停留距离:在下一周期生效即可。
焊接速度:在plan中通过动态调整运动约束实现.
4.开发内容及问题
4.1 确定开发版本,先在0.40开发,后迁到0.39
4.2 轨迹偏移计算: interface中增加轨迹偏移计算接口(规划中摆动计算代码迁移)
- 正弦摆动幅值,停留距离计算--迁移规划已有代码@zjq
- 步长设置改为频率; 新增方位角和中心上升偏移计算 @ldy
4.3渐变策略: interface中增加动态调整摆动参数接口,优先支持频率和振幅,需考虑渐变策略代码实现 @ldy
4.4 摆动结束处理: 因为用户调整摆动频率或焊接速度, 总是容易出现无法正好摆动到路径终点的情况, 解决方案:
- 微调步长, 摆动周期总是保持整数个,但可能和用户预期频率不符
- 只在最后一个周期调整步长,只摆动半个周期, 倾向于该方案 @ldy
可支持动态交融(原先不支持)
需明确知道剩余路径长度,才能进行摆动结束处理.例如:
如果剩余路径不能一个摆动周期,则摆动半个周期到终点;
如果还可摆多个周期,则正常计算偏移
注意: 因支持动态交融,剩余路径长度可能随着路径插入在不断变化
解决方案:
plan维护路径信息,可输出给interface层; 轨迹点输出距离所在路径起点的距离(弧长)
路径信息包括: 路径id, 路径弧长, 路径类型, 最大曲率, 规划方式, 交融半径
4.5 摆动停留时间
4.5.1 方案一
plan
新增接口支持在指定位置处速度为0,并设置停留时间. 其中位置可以用路径弧长描述
int tpSetMultiPointVelocityConstraints(const std::vector<double>& multi_point, const std::vector<double>& vel, const double& hold_time);
速度为0时停留时间起作用
新增接口支持根据路径id范围提供路径弧长信息
int tpGetPathLengthByPathIds(const Array2d& id, const std::vector<std::vector<double>>& id_length);
interface
- 通过tpGetPathLengthByPathIds获取位置弧长, 根据位置弧长和摆动步长,计算停留位置
- 通过tpSetMultiPointVelocityConstraints设置速度规划约束
- 动态调整频率时位置弧长计算需结合具体的位置和步长计算停留位置
调用流程
weave start //开始
tpSetWeaveParameters //设置摆动参数
tpAddPositionLine //路径插入
...
tpGetPathLengthByPathIds //获取总的位置长度
tpSetMultiPointVelocityConstraints //设置速度约束
tpSetEndPath //触发速度规划 (这里需要显示触发速度规划,避免使用右交融半径小于0触发规划)
weave end //结束
4.5.2 方案二
在interface层通过plan的路径预览接口获得一系列停留的路点,路点之间走直线,速度零到零,通过运动属性中的keep_time设置停留时间,实现停留功能.
具体的,
//!提供摆动路径插入接口
int tpAddWeavePath(const std::vector<MotionProperty>& path_info) const = 0;
//!计算幅值处位置,设置分辨率长度
int tpGetPathPointAtGivenResolutionLength(const std::vector<MotionProperty>& path_info, const double& s, std::vector<PathPoint>& interPoints) const = 0;
//!插入直线路径
int tpAddPositionLine(const PathPoint& point, const PathProperty& path_property, const MoveProperty& move_property) = 0;
//!取点叠加
int tpUpdateCycle(const double& cycle, TrajectoryPoint& point) = 0;
动态调整频率.步长改变,幅值位置需重新计算,路径预览接口需重载
//!计算幅值处位置,设置分辨率长度
/**
* path_info: 路径信息
* start: 取点起始位置
* s: 指定分割间隔,会按照分割间隔取点,默认按照最后一个元素在剩余的路径上间隔取点
* interPoints: 输出的路点
*/
int tpGetPathPointAtGivenResolutionLength(const std::vector<MotionProperty>& path_info, const double& start, std::vector<double>& s, std::vector<PathPoint>& interPoints) const = 0;
存在的问题: 路点所在摆动周期的具体位置需考虑如何计算?
5.开发计划
计划在4月下旬提供测试包,包含频率、方位角、仰角、中心上升设置;支持正弦摆动参数(频率和幅值)调整